package com.shop.cereshop.commons.tencent.moderation.domain.response;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.shop.cereshop.commons.tencent.moderation.constant.ModerationConstant;
import com.shop.cereshop.commons.tencent.moderation.util.ModerationUtils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * @description: 腾讯云通用内容审核结果（用于封装文本、图片等内容安全审核的返回结果、适用于同步审核的场景）
 * @author zdd
 * @date 2025/10/26 14:16
 * @version 1.0
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ModerationResult implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 审核是否成功
     * true: 审核请求成功完成（不代表内容通过审核）
     * false: 审核请求失败，可能由于网络、参数错误等原因
     */
    private boolean success;

    /**
     * 审核建议
     * Block: 违规，建议拦截
     * Review: 疑似违规，建议人工复核
     * Pass: 正常，建议通过
     */
    private String suggestion;

    /**
     * 违规标签
     * Normal: 正常
     * Porn: 色情
     * Sexy: 性感
     * Polity: 政治敏感
     * Illegal: 违法
     * Abuse: 谩骂
     * Terror: 暴恐
     * Ad: 广告
     * 其他: 腾讯云可能返回的其他标签
     */
    private String label;

    /**
     * 置信度分数
     * 范围：0-100，分数越高表示置信度越高
     * 例如：85 表示85%置信度认为属于该标签
     * 通常阈值：>= 90 为高置信度，60-89 为中置信度，< 60 为低置信度
     */
    private Long score;

    /**
     * 错误信息或状态描述
     * 当success为false时，此处包含详细的错误信息
     * 当success为true时，可能为空或包含提示信息
     */
    private String message;

    /**
     * 审核耗时（毫秒）
     * 从发起审核请求到获得结果的总耗时
     * 包含网络传输、腾讯云处理时间等
     */
    private Long costTime;

    /**
     * 数据标识ID
     * 请求时传入的dataId，用于业务方关联原始数据
     * 如果未传入，系统会自动生成UUID
     */
    private String dataId;

    /**
     * 审核类型
     * TEXT: 文本审核
     * IMAGE: 图片审核
     * 用于区分不同审核场景的结果处理
     */
    private String moderationType;

    /**
     * 业务类型
     * 请求时传入的bizType，标识不同的业务场景
     * 用于区分不同的审核策略
     */
    private String bizType;

    /**
     * 审核时间戳
     * 审核完成的时间点（毫秒时间戳）
     * 可用于排序、统计等场景
     */
    private Long moderationTime;

    /**
     * 风险级别
     * LOW: 低风险
     * MEDIUM: 中风险
     * HIGH: 高风险
     * 根据suggestion和score综合计算得出
     */
    private String riskLevel;

    /**
     * 扩展字段
     * 用于存储额外的审核信息，如关键词、位置信息等
     * JSON格式的字符串
     */
    private String extraInfo;

    /**
     * 创建成功的审核结果
     * @param suggestion 审核建议
     * @param label 违规标签
     * @param score 置信度分数
     * @return 审核结果对象
     */
    public static ModerationResult success(String suggestion, String label, Long score) {
        ModerationResult result = new ModerationResult()
                .setSuccess(true)
                .setSuggestion(suggestion)
                .setLabel(label)
                .setScore(score)
                .setModerationTime(System.currentTimeMillis());
        if (ModerationConstant.SUGGESTION_PASS.equals(result.getSuggestion())) {
            result.setMessage("审核通过");
        } else {
            result.setMessage("内容" + result.getSuggestionDesc() + "[" + result.getLabelDesc() + "]，请遵守相关法律法规！");
        }
        return result;
    }

    /**
     * 创建失败的审核结果
     * @param message 错误信息
     * @return 审核结果对象
     */
    public static ModerationResult fail(String message) {
        ModerationResult result = new ModerationResult();
        result.setSuccess(false);
        result.setMessage(message);
        result.setModerationTime(System.currentTimeMillis());
        return result;
    }


    /**
     * 创建通过的审核结果（快捷方法）
     * @return 通过的审核结果
     */
    public static ModerationResult pass() {
        return success(ModerationConstant.SUGGESTION_PASS, ModerationConstant.LABEL_NORMAL, 0L);
    }

    /**
     * 创建需要复核的审核结果（快捷方法）
     * @param label 疑似违规标签
     * @param score 置信度分数
     * @return 需要复核的审核结果
     */
    public static ModerationResult review(String label, Long score) {
        return success(ModerationConstant.SUGGESTION_REVIEW, label, score);
    }

    /**
     * 创建拦截的审核结果（快捷方法）
     * @param label 违规标签
     * @param score 置信度分数
     * @return 拦截的审核结果
     */
    public static ModerationResult block(String label, Long score) {
        return success(ModerationConstant.SUGGESTION_BLOCK, label, score);
    }

    /**
     * 获取审核建议的中文描述
     * @return 中文描述
     */
    public String getSuggestionDesc() {
        return ModerationUtils.getSuggestionDesc(getSuggestion());
    }

    /**
     * 获取违规标签的中文描述
     * @return 中文描述
     */
    public String getLabelDesc() {
        return ModerationUtils.getLabelDesc(getLabel());
    }

    /**
     * 获取风险级别
     * @return 风险级别
     */
    public String getRiskLevel() {
        return ModerationUtils.getRiskLevel(isSuccess(), getSuggestion(), getScore());
    }

}
